#!/usr/bin/env python3
"""
资产收集Agent打包脚本
使用: python main.py
"""

import os
import sys
import shutil
import platform
from pathlib import Path

try:
    import PyInstaller.__main__
except ImportError:
    print("正在安装PyInstaller...")
    os.system("pip install pyinstaller")
    import PyInstaller.__main__

try:
    from PIL import Image, ImageDraw
except ImportError:
    print("正在安装Pillow...")
    os.system("pip install pillow")
    from PIL import Image, ImageDraw


def create_icon():
    """创建应用程序图标"""
    script_dir = os.path.dirname(os.path.abspath(__file__))
    icon_path = os.path.join(script_dir, "icon.ico")

    if not os.path.exists(icon_path):
        print("创建应用程序图标...")

        # 创建64x64图标
        image = Image.new('RGBA', (64, 64), (0, 0, 0, 0))
        dc = ImageDraw.Draw(image)

        # 绘制渐变背景
        for i in range(64):
            color = (30, 144, 255, int(255 * (i / 64)))
            dc.line([(0, i), (64, i)], fill=color)

        # 绘制中心圆圈和字母A
        dc.ellipse([16, 16, 48, 48], fill=(255, 255, 255, 200), outline=(255, 255, 255))

        # 尝试使用字体
        try:
            from PIL import ImageFont
            font_paths = [
                "C:/Windows/Fonts/arial.ttf",
                "C:/Windows/Fonts/arialbd.ttf",
            ]
            font = None
            for font_path in font_paths:
                if os.path.exists(font_path):
                    font = ImageFont.truetype(font_path, 20)
                    break
            if font is None:
                font = ImageFont.load_default()
        except:
            font = ImageFont.load_default()

        dc.text((32, 32), "A", fill=(30, 144, 255), font=font, anchor="mm")
        image.save(icon_path, format='ICO')
        print(f"图标已创建: {icon_path}")

    return icon_path


def check_resource_dirs():
    """检查资源目录是否存在"""
    required_dirs = ['templates', 'static']
    missing_dirs = []

    for dir_name in required_dirs:
        if not os.path.exists(dir_name):
            missing_dirs.append(dir_name)
            os.makedirs(dir_name, exist_ok=True)
            print(f"警告: 目录 {dir_name} 不存在，已创建空目录")

    return missing_dirs


def build_agent():
    """构建Agent"""
    icon_path = create_icon()

    # 检查资源目录
    missing_dirs = check_resource_dirs()
    if missing_dirs:
        print(f"警告: 以下目录不存在: {missing_dirs}")

    # PyInstaller配置 - 无控制台版本
    pyinstaller_args = [
        'agent.py',
        '--name=AssetAgent',
        '--onefile',
        '--noconsole',
        f'--icon={icon_path}',
        '--add-data=templates;templates',
        '--add-data=static;static',
        # 隐藏导入
        '--hidden-import=requests',
        '--hidden-import=psutil',
        '--hidden-import=pystray',
        '--hidden-import=PIL',
        '--hidden-import=PIL.Image',
        '--hidden-import=PIL.ImageDraw',
        '--hidden-import=PIL.ImageFont',
        '--hidden-import=tkinter',
        '--hidden-import=tkinter.ttk',
        # Windows特定
        '--hidden-import=winreg',
        '--hidden-import=ctypes',
        '--hidden-import=subprocess',
        # 其他必要模块
        '--hidden-import=json',
        '--hidden-import=logging',
        '--hidden-import=threading',
        '--hidden-import=datetime',
        '--hidden-import=platform',
        '--hidden-import=socket',
        '--hidden-import=argparse',
        '--hidden-import=tempfile',
        '--hidden-import=os',
        '--hidden-import=sys',
        '--hidden-import=pathlib',
        # 添加这些确保完整性
        '--hidden-import=queue',
        '--hidden-import=urllib3',
        '--hidden-import=chardet',
        '--hidden-import=idna',
        '--hidden-import=certifi',
    ]

    print("开始打包无控制台版本...")
    print(f"PyInstaller 参数: {pyinstaller_args}")

    try:
        PyInstaller.__main__.run(pyinstaller_args)
        print("打包完成!")

        # 检查生成的可执行文件
        dist_dir = 'dist'
        exe_path = os.path.join(dist_dir, 'AssetAgent.exe')
        if os.path.exists(exe_path):
            file_size = os.path.getsize(exe_path) / (1024 * 1024)  # MB
            print(f"生成的可执行文件: {exe_path} ({file_size:.2f} MB)")

            # 打包完成说明
            print("\n✅ 无控制台版本打包成功！")
            print("✅ 不会显示黑框控制台窗口")
            print("✅ 双击直接运行显示配置界面")
            print("✅ 支持命令行参数启动")

            # 使用说明
            print("\n使用说明:")
            print("1. 双击 AssetAgent.exe 打开配置窗口")
            print("2. 右键托盘图标可进行各种操作")
            print("3. 使用 AssetAgent.exe --minimized 直接后台运行")
        else:
            print("错误: 可执行文件未生成!")
            return False

        # 清理临时文件（可选）
        cleanup = input("\n是否清理临时构建文件? (y/n): ").lower().strip()
        if cleanup == 'y':
            if os.path.exists('build'):
                shutil.rmtree('build')
                print("已清理 build 目录")
            if os.path.exists('AssetAgent.spec'):
                os.remove('AssetAgent.spec')
                print("已清理 spec 文件")
        else:
            print("保留临时文件以便调试")

    except Exception as e:
        print(f"打包失败: {e}")
        import traceback
        traceback.print_exc()

        # 提供调试建议
        print("\n调试建议:")
        print("1. 检查 Python 环境: python --version")
        print("2. 检查 PyInstaller 版本: pyinstaller --version")
        print("3. 尝试更新包: pip install --upgrade pyinstaller pillow pystray psutil requests")
        print("4. 检查 agent.py 文件是否存在")

        return False

    return True


def check_environment():
    """检查打包环境"""
    print("检查打包环境...")

    # 检查Python版本
    python_version = platform.python_version()
    print(f"Python 版本: {python_version}")

    # 检查PyInstaller版本
    try:
        import PyInstaller
        print(f"PyInstaller 版本: {PyInstaller.__version__}")
    except ImportError:
        print("PyInstaller 未安装")
        return False

    # 检查必要包
    required_packages = ['PIL', 'pystray', 'psutil', 'requests']
    missing_packages = []

    for package in required_packages:
        try:
            if package == 'PIL':
                import PIL
            else:
                __import__(package)
            print(f"✅ {package} 已安装")
        except ImportError:
            print(f"❌ {package} 未安装")
            missing_packages.append(package)

    if missing_packages:
        print(f"\n缺少必要的包: {missing_packages}")
        install = input("是否自动安装? (y/n): ").lower().strip()
        if install == 'y':
            for package in missing_packages:
                if package == 'PIL':
                    os.system("pip install pillow")
                else:
                    os.system(f"pip install {package}")
        else:
            print("请手动安装缺少的包后重试")
            return False

    return True


if __name__ == '__main__':
    print("资产收集Agent打包工具 ")
    print("=" * 50)
    print("注意: 此版本为无控制台版本")
    print("=" * 50)

    # 检查环境
    if check_environment():
        # 开始打包
        build_agent()
    else:
        print("环境检查失败，请修复问题后重试")
        sys.exit(1)